// 封装一个ajax函数
(function () {
  // 使用工厂模式，创建ajax对象
  function createHxr() {
    let xhr = null;
    // 根据浏览器不同，创建AJAX对象，xhr对象的接口，都是相同的
    if (window.XMLHttpRequest) {
      xhr = new XMLHttpRequest()
    } else {
      xhr = new ActiveXObject('Microsoft.XMLHTTP')
    }
    return xhr;
  }
  //  参数序列号的函数：get,post的参数处理方法是不一样的。语法业不同。
  // { a: 1, b: 2 } => a=1&b=2
  function formatParams(params) {
    let str = [];
    if (typeof params === 'object') {
      for (const k in params) {
        str.push(`${k}=${params[k]}`) // [a=1 , b=2]
      }
      return str.join("&") //a=1&b=2&c=3,....

    } else if (typeof params === 'string') {
      return params
    }
  }

  //  ajax核心方法
  function _ajax(options) {
    // console.log(formatParams(options.data)); //a=1&b=2&c=asdf&d=true
    // 1.创建ajax对象
    let xhr = createHxr();
    // 2. 判断obj参数的有效性：
    if (options.url === undefined) {
      throw new Error('url 是必须的')
    }
    if (options.type === undefined) {
      options.type = 'GET'
    }
    // 判断成功时执行的success函数
    if (options.success === undefined) {
      throw new Error('success 是必须的')
    } else if (typeof options.success !== 'function') {
      throw new Error('success 必须是一个function')
    }

    // 判断异步
    if (options.async === undefined) {
      options.async = true; // 默认是异步的请求
    } else if (typeof options.async !== 'boolean') {
      throw new Error('success 必须是一个 boolean 类型的值')
    }

    // 转换type值为大写或小写
    // if(options.type){
    //   options.type = options.type.toUpperCase();//大写
    // }

    options.type = options.type?.toUpperCase()
    // console.log(options.type); // 'GET'

    // 判断type是否合法；
    if (options.type !== 'GET' && options.type !== 'POST' && options.type !== 'PUT' && options.type !== 'DELETE' && options.type !== 'OPTIONS') {
      throw new Error('参数 type 的值只有 GET,POST,DELETE,PUT,OPTIONS 5种，不分大小写字母')
    }

    // 判断返回的数据类型：
    if (options.dataType === undefined) {
      options.dataType = 'text'
    }
    // AJAX实现的步骤
    if (options.type === 'GET') {
      xhr.open(
        options.type,
        options.url + "?" + formatParams(options.data),// a=1&b=2
        options.async
      )
      xhr.send(null)
    } else if (options.type === 'POST') {
      xhr.open(options.type, options.url)
      xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
      xhr.send(formatParams(options.data))
    }
    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4 && xhr.status === 200) {
        if (options.dataType === 'json') {
          options.success(JSON.parse(xhr.responseText))

        } else if (options.dataType === 'text') {
          options.success(xhr.responseText)
        }
      }
    }


  }
  window.ajax = _ajax; //公开，暴露接口
})();